/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.ctu.labiras.aco;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import br.ctu.labiras.testador.Individuo;
/**
 *
 * @author thiago
 */
public class Formiga extends Individuo {  
    // Fitness    
    // Celulas disponÃ­veis
    private List<Integer> nosVizinhos;
    // Lista tabu
    private List<Integer> nosVisitados;
    // No de origem
    private Integer celulaInicial;
            
    public Formiga(int qtdeElementos) {
        super(qtdeElementos);
        this.nosVizinhos = new ArrayList<Integer>();
        this.nosVisitados = new ArrayList<Integer>();
    }

    /**
     * @return a avaliaÃ§Ã£o
     */
//    @Override
//    public Double getAvaliacao() {
//        return avaliacao;
//    }

    /**
     * @param avaliacao a avaliaÃ§Ã£o a configurar
     */
//    public void setAvaliacao(double avaliacao) {
//        this.avaliacao = avaliacao;
//    }

    public void configurarVizinhos(int numCelulas) {
        for(int i = 0; i < numCelulas; i++) {
            getNosVizinhos().add(i);
        }
    }
    
    /**
     * @return os nosVisitados
     */
    public List<Integer> getNosVisitados() {
        return nosVisitados;
    }
    
    public void removerNoVizinho(Integer no) {
        nosVizinhos.remove(no);
    }
    
    /**
     * @param indice 
     */
    public void adicionarNoVisitado(Integer valor) {
        nosVisitados.add(valor);
    }

    public void adicionarNoVisitado(int indice, Integer valor) {
        nosVisitados.add(indice, valor);
    }
    /**
     * @return os nosVizinhos
     */
    public List<Integer> getNosVizinhos() {
        return nosVizinhos;
    }
    
    public boolean comtemNoVisitado(Integer no) {
        return (nosVisitados.contains(no));
    }
    
    public String exibirCaminho() {
        String caminho = "{ ";
        
        Iterator<Integer> it = nosVisitados.iterator();
        while(it.hasNext()) {
            caminho += it.next().toString()+ " ";
        }
        caminho += "}";
        
        return caminho;
    }
    
    public void resetarSolucao() {        
        nosVisitados.clear();
    }

    /**
     * @return the celula
     */
    public Integer getCelula() {
        return celulaInicial;
    }

    /**
     * @param celula the celula to set
     */
    public void setCelula(Integer celula) {
        this.celulaInicial = celula;
    }
    
    public void adicionarCelulaInicial() {
        this.adicionarNoVisitado(this.celulaInicial);
    }
    
    public void preencheCenario() {
        int tam = nosVizinhos.size();
        int qtd = (int)Math.sqrt(tam);
        int x, y;
        
        for(int i = 0; i < tam; i++) {
            x = i/qtd;
            y = i-(x*qtd);
            
            if(nosVisitados.contains(i)) {
                setValorCenario(x, y, 1);
            } else {
                setValorCenario(x, y, 0);
            }
        }
    }
}